#ifndef GAME_HPP
# define GAME_HPP

#include "Input.hpp"
#include "Window.hpp"
#include "GameClock.hpp"

namespace	gdl
{
  ////////////////////////////////////////////////////////////
  /// Forward declaration of GameImpl.
  ////////////////////////////////////////////////////////////
  class GameImpl;
  ////////////////////////////////////////////////////////////
  /// The Window class offers you an easier way to develop a game.
  /// You just need to inherite from it and override three
  /// methods : initialize, update and draw.
  ////////////////////////////////////////////////////////////
  class	Game
  {
  public:
    ////////////////////////////////////////////////////////////
    /// Default constructor.
    ////////////////////////////////////////////////////////////
    Game(void);
    ////////////////////////////////////////////////////////////
    /// Default destructor.
    ////////////////////////////////////////////////////////////
    virtual		~Game(void);
    ////////////////////////////////////////////////////////////
    /// Call the initialize methode, create the window.
    /// While the window is open call update, draw and display
    /// the window.
    ////////////////////////////////////////////////////////////
    void		run(void);

    ////////////////////////////////////////////////////////////
    /// Get the root for the Content.
    ///
    /// \return Path to the Root.
    ////////////////////////////////////////////////////////////
    std::string const & getContentRoot(void) const;

    ////////////////////////////////////////////////////////////
    /// Set the root for the Content.
    ///
    /// \param[in] name Path to the Root.
    ////////////////////////////////////////////////////////////
    void		setContentRoot(std::string const &);

  protected:
    ////////////////////////////////////////////////////////////
    /// To override.
    ////////////////////////////////////////////////////////////
    virtual void	initialize(void) = 0;
    ////////////////////////////////////////////////////////////
    /// To override.
    ////////////////////////////////////////////////////////////
    virtual void	update(void) = 0;
    ////////////////////////////////////////////////////////////
    /// To override.
    ////////////////////////////////////////////////////////////
    virtual void	draw(void) = 0;
    ////////////////////////////////////////////////////////////
    /// To override.
    ////////////////////////////////////////////////////////////
    virtual void	unload(void) = 0;

    ////////////////////////////////////////////////////////////
    /// Game window.
    ////////////////////////////////////////////////////////////
    Window		window_;

    ////////////////////////////////////////////////////////////
    /// Game clock.
    ////////////////////////////////////////////////////////////
    GameClock		gameClock_;

    ////////////////////////////////////////////////////////////
    /// Input manager.
    ////////////////////////////////////////////////////////////
    Input		input_;

  private:
    ////////////////////////////////////////////////////////////
    /// Game Implementation
    ////////////////////////////////////////////////////////////
    GameImpl&		gameInternal_;
  };
}

#endif /* !GAME_HPP */
